home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Graphics Plus
/
Graphics Plus.iso
/
amiga
/
animutil
/
kfast
/
kfast.lzh
/
KFAST
/
src
/
lines.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-07-03
|
8KB
|
325 lines
#include "skeleton.h"
/* line primitives */
void setbox(line_ptr seg)
{
int i,x,y;
if((seg==NULL) || (seg->pts==NULL)) return;
seg->box[0][0] = seg->pts->p[0][0];
seg->box[0][1] = seg->pts->p[0][1];
seg->box[1][0] = seg->pts->p[0][0];
seg->box[1][1] = seg->pts->p[0][1];
for(i=1;i<seg->number;i++)
{
x = seg->pts->p[i][0];
y = seg->pts->p[i][1];
if(x<seg->box[0][0]) seg->box[0][0] = x;
if(x>seg->box[1][0]) seg->box[1][0] = x;
if(y<seg->box[0][1]) seg->box[0][1] = y;
if(y>seg->box[1][1]) seg->box[1][1] = y;
}
}
line_ptr addpoint(line_ptr seg,int x,int y)
{
if(seg==NULL)
{
seg=(line_ptr)malloc(sizeof(struct line));
seg->number = 1;
seg->box[0][0] = x;
seg->box[1][0] = x;
seg->box[0][1] = y;
seg->box[1][1] = y;
seg->linec = 1;
seg->fillc = 0;
seg->pts=(struct pts *)malloc(sizeof(struct pts)*POINTS);
seg->pts->p[0][0]=x;
seg->pts->p[0][1]=y;
seg->next = NULL;
}
else
{
if(x<seg->box[0][0]) seg->box[0][0] = x;
if(x>seg->box[1][0]) seg->box[1][0] = x;
if(y<seg->box[0][1]) seg->box[0][1] = y;
if(y>seg->box[1][1]) seg->box[1][1] = y;
if(seg->number%POINTS==0)
seg->pts=(struct pts *)realloc((void *)seg->pts,
sizeof(struct pts)*POINTS*(seg->number/POINTS+1),
sizeof(struct pts)*POINTS*(seg->number/POINTS));
seg->pts->p[seg->number][0] = x;
seg->pts->p[seg->number][1] = y;
seg->number = seg->number + 1;
}
if(seg->number==1) /* a single point is entered twice */
{
seg->pts->p[1][0]=x;
seg->pts->p[1][1]=y;
}
return(seg);
}
line_ptr appendpoint(line_ptr line,int x,int y)
{
if(line==NULL) return(addpoint(NULL,x,y));
while(line->next!=NULL)
line=line->next;
return(addpoint(line,x,y));
}
void insertpoint(line_ptr seg,int point,int x,int y)
{
int xs,ys;
if(seg==NULL) return;
if(point>=seg->number) return((void)addpoint(seg,x,y));
if(x<seg->box[0][0]) seg->box[0][0] = x;
if(x>seg->box[1][0]) seg->box[1][0] = x;
if(y<seg->box[0][1]) seg->box[0][1] = y;
if(y>seg->box[1][1]) seg->box[1][1] = y;
if(seg->number%POINTS==0)
seg->pts=(struct pts *)realloc((void *)seg->pts,
sizeof(struct pts)*POINTS*(seg->number/POINTS+1),
sizeof(struct pts)*POINTS*(seg->number/POINTS));
for(;point<seg->number;point++)
{
xs = seg->pts->p[point][0];
ys = seg->pts->p[point][1];
seg->pts->p[point][0] = x;
seg->pts->p[point][1] = y;
x = xs;
y = ys;
}
seg->pts->p[seg->number][0]=x;
seg->pts->p[seg->number][1]=y;
seg->number = seg->number + 1;
}
void deletepoint(line_ptr seg,int point)
{
if(seg==NULL || point>=seg->number || seg->number==0) return;
seg->number = seg->number-1;
for(;point<seg->number;point++)
{
seg->pts->p[point][0] = seg->pts->p[point+1][0];
seg->pts->p[point][1] = seg->pts->p[point+1][1];
}
if(seg->number%POINTS==0)
if(seg->number!=0)
seg->pts=(struct pts *)realloc((void *)seg->pts,
sizeof(struct pts)*POINTS*(seg->number/POINTS),
sizeof(struct pts)*POINTS*(seg->number/POINTS+1));
return;
}
void movepoint(line_ptr seg,int point,int x,int y)
{
if(seg==NULL || point>=seg->number) return;
seg->pts->p[point][0] = x;
seg->pts->p[point][1] = y;
if(x<seg->box[0][0]) seg->box[0][0] = x;
if(x>seg->box[1][0]) seg->box[1][0] = x;
if(y<seg->box[0][1]) seg->box[0][1] = y;
if(y>seg->box[1][1]) seg->box[1][1] = y;
return;
}
line_ptr copyline(line_ptr line)
{
line_ptr newline,seg,last;
newline = NULL;
last = NULL;
while(line!=NULL)
{
seg=(line_ptr)malloc(sizeof(struct line));
memcpy((char *)seg,(char *)line,sizeof(struct line));
if(seg->pts!=NULL)
{
seg->pts=(struct pts *)
malloc(sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1));
memcpy((char *)seg->pts,(char *)line->pts,
seg->number*sizeof(struct pts));
}
if(seg->number==1)
{
seg->pts->p[1][0] = seg->pts->p[0][0];
seg->pts->p[1][1] = seg->pts->p[0][1];
}
if(newline==NULL)
newline = seg;
else
last->next = seg;
last = seg;
line = line->next;
}
return(newline);
}
/*
line_ptr findpoint(line_ptr line,int x,int y,int *point)
{
while(line!=NULL)
{
for(;*point<=line->number;(*point)++)
if(x==line->pts->p[*point][0] && y==line->pts->p[*point][1])
return(line);
line = line->next;
*point = 0;
}
return(NULL);
}
*/
/*
line_ptr findintersect(line_ptr line,int x,int y,int *point)
{
int x1,y1,x2,y2;
while(line!=NULL)
{
for(;*point<line->number-1;(*point)++)
{
x1 = line->pts->p[*point][0];
y1 = line->pts->p[*point][1];
x2 = line->pts->p[*point+1][0];
y2 = line->pts->p[*point+1][1];
if(x>=min(x1,x2) && x<=max(x1,x2) &&
y>=min(y1,y2) && y<=max(y1,y2) &&
abs((x1-x2)*(y-y1)-(x-x1)*(y1-y2))<
min(abs(x1-x2),abs(y1-y2)) )
return(line);
}
line = line->next;
*point = 0;
}
return(NULL);
}
*/
line_ptr cutseg(line_ptr seg,int point)
{
line_ptr newseg;
if(point>=seg->number) return(NULL);
newseg=(line_ptr)malloc(sizeof(struct line));
memcpy((char *)newseg,(char *)seg,sizeof(struct line));
newseg->next = NULL;
newseg->number = seg->number-point;
newseg->pts=(struct pts *)
malloc(sizeof(struct pts)*POINTS*((newseg->number-1)/POINTS+1));
memcpy((char *)newseg->pts,(char *)seg->pts->p[point],
newseg->number*sizeof(struct pts));
setbox(newseg);
if(newseg->number==1)
{
newseg->pts->p[1][0] = seg->pts->p[0][0];
newseg->pts->p[1][1] = seg->pts->p[0][1];
}
if(seg->number/POINTS != (point+1)/POINTS)
seg->pts=(struct pts *)realloc((void *)seg->pts,
sizeof(struct pts)*POINTS*(point/POINTS+1),
sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1));
seg->number = point + 1;
setbox(seg);
if(seg->number==1)
{
seg->pts->p[1][0] = seg->pts->p[0][0];
seg->pts->p[1][1] = seg->pts->p[0][1];
}
return(newseg);
}
/*
line_ptr deleteseg(line_ptr seg)
{
line_ptr next;
if(seg==NULL) return(NULL);
next = seg->next;
free(seg->pts,sizeof(struct pts)*POINTS*((seg->number-1)/POINTS+1));
free(seg,sizeof(struct line));
return(next);
}
*/
/*
line_ptr cutline(line_ptr line,line_ptr seg)
{
while(line!=NULL && line->next!=seg)
line=line->next;
if(line==NULL) return(NULL);
line->next = NULL;
return(seg);
}
*/
void deleteline(line_ptr line)
{
line_ptr delete;
while(line!=NULL)
{
delete = line;
line = line->next;
free(delete->pts,sizeof(struct pts)*POINTS*((delete->number-1)/POINTS+1));
free(delete,sizeof(struct line));
}
}
void appendline(line_ptr line,line_ptr append)
{
if(line==NULL) return;
while(line->next!=NULL)
line=line->next;
line->next = append;
}
/*
void scaleline(line_ptr line,int xfact,int yfact)
{
int i;
while(line!=NULL)
{
line->box[1][0] = (((line->box[1][0]-line->box[0][0])
* xfact)>>8) + line->box[0][0];
line->box[1][1] = (((line->box[1][1]-line->box[0][1])
* yfact)>>8) + line->box[0][1];
for(i=0;i<line->number;i++)
{
line->pts->p[i][0] = (((line->pts->p[i][0]-line->box[0][0])
* xfact)>>8) + line->box[0][0];
line->pts->p[i][1] = (((line->pts->p[i][1]-line->box[0][1])
* yfact)>>8) + line->box[0][1];
}
line = line->next;
}
}
*/